Powershell scripts/Storage Price Estimation Script/D4Storage-PricingEstimation-Per-Storage.ps1 (65 lines of code) (raw):
#Requires -Version 7.0
#Requires -Modules Az.Monitor
#Requires -Modules Az.Storage
$OverageBar = 73000000
$PricePer1MOverageTransactions = 0.1492
$CostPerStorageAccount = 10
$GetMetricRetries = 3
if ($null -eq $(Get-AzContext)) {Connect-AzAccount}
$subscriptions = Get-AzSubscription
$subscriptionTotalCostArray =@()
$totalCost = 0
try{
foreach ($subscriptionId in $subscriptions.Id)
{
$subscriptionOverageCost = 0
Set-AzContext -Subscription $SubscriptionId -ErrorAction Stop
$storageAccounts = Get-AzStorageAccount -ErrorAction Stop
$startDate = (get-date (get-date).AddMonths(-1) -UFormat "%F")
$endDate = Get-Date -UFormat "%F"
Write-Host "Estimating Defender For Storage monthly price for $($storageAccounts.Length) accounts"
foreach ($storage in $storageAccounts){
$metric = $null
for ($attempt = 0; $attempt -lt $GetMetricRetries; $attempt++) {
try {
$metric = Get-AzMetric `
-ResourceId $($storage.Id) `
-MetricName Transactions `
-AggregationType "Total" `
-StartTime $startDate `
-EndTime $endDate `
-TimeGrain $(New-TimeSpan -Days 1) `
-WarningAction SilentlyContinue `
-ErrorAction Stop
}
catch {
if($attempt -eq ($GetMetricRetries - 1)){
throw
}
Write-Error "Got an error: $($PSItem.Exception.Message)"
}
}
$totalTransactions = ($metric.Data.Total | Measure-Object -sum).Sum
$overageTransactions = (($totalTransactions - $OverageBar) -ge 0) ? ($totalTransactions - $OverageBar) : 0
$overageCost = $(($overageTransactions) / 1000000 * $PricePer1MOverageTransactions)
$totalCost += $overageCost
$subscriptionOverageCost += $overageCost
}
$subscriptionCostObject = New-Object PSObject -property @{
subscriptionOverageCost = $subscriptionOverageCost;
subscriptionBaseStorageCost = $storageAccounts.Length * $CostPerStorageAccount;
numberOfStorageAccounts = $storageAccounts.Length;
subscriptionId = $subscriptionId
}
$subscriptionTotalCostArray += $subscriptionCostObject
$totalCost += $CostPerStorageAccount * $storageAccounts.Length
}
}
catch
{
$subscriptionTotalCostArray| ConvertTo-csv | out-file DefenderEstimatedCostBySubscription.csv
Write-Error "The script encountered an error, partiall results were saved to a .csv file in the script directory"
throw
}
$subscriptionTotalCostArray| ConvertTo-csv | out-file DefenderEstimatedCostBySubscription.csv
Write-Host "Total Defender for storage cost for $($subscriptions.Length) subscription: $("{0:C2}" -f $totalCost)"